package cn.stu.cms.controller;

import cn.stu.cms.dto.*;
import cn.stu.cms.pojo.Users;
import cn.stu.cms.service.UsersService;
import cn.stu.cms.util.R;
import cn.stu.cms.util.UserHolder;
import cn.stu.cms.vo.UsersVo;
import cn.stu.cms.vo.routes.GetMenuVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

import static cn.stu.cms.common.CommonConstants.DEFAULT_PASSWORD;
import static cn.stu.cms.common.CommonConstants.OPERATION_OK;

/**
 * (Users)表控制层
 *
 * @author gh
 * @since 2023-07-21 17:11:52
 */
@RestController
@RequestMapping("/users")
@AllArgsConstructor
public class UsersController {
    /**
     * 服务对象
     */
    private UsersService usersService;

    /**
     * 获取路由
     *
     * @return {@link R}
     */
    @GetMapping(value = "/getRoutes")
    public R<List<GetMenuVo>> getRoutes() {
        Users users = usersService.getById(UserHolder.getUser().getUserId());
        return usersService.getRoutes(users.getRoleId());
    }

    /**
     * 查询全部对象
     *
     * @return 全部数据
     */
    @GetMapping("/page")
    public R<Page<UsersVo>> page(PageDto<UsersVo> page, UserSaveDto dto) {
        return usersService.queryPage(page, dto);
    }

    /**
     * 通过主键查询单条数据
     *
     * @return 单条数据
     */
    @GetMapping("/getUserInfo")
    public R<UsersVo> queryById() {
        Long userId = UserHolder.getUser().getUserId();
        return usersService.queryById(userId);
    }

    /**
     * 保存
     *
     * @param userSaveDto 用户将数据保存到
     * @return 新增结果
     */
    @PostMapping("/save")
    public R<Boolean> add(@RequestBody @Valid UserSaveDto userSaveDto) {
        return usersService.add(userSaveDto);
    }

    /**
     * 编辑数据
     *
     * @param userSaveDto 用户将数据保存到
     * @return 编辑结果
     */
    @PutMapping("/edit")
    public R<Boolean> edit(@RequestBody @Valid UserSaveDto userSaveDto) {
        return usersService.edit(userSaveDto);
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @DeleteMapping("/delete/{id}")
    public R<Boolean> delete(@PathVariable Long id) {
        return usersService.deleteById(id);
    }

    /**
     * 登录
     *
     * @param loginDto 登录数据到
     * @return {@link R}
     */
    @PostMapping("/login")
    public R<String> login(@RequestBody @Valid LoginDto loginDto) {
        return usersService.login(loginDto);
    }

    /**
     * 密码重置
     *
     * @param resetDto 将数据重置为
     * @return {@link R}<{@link Boolean}>
     */
    @PostMapping("/reset")
    public R<Boolean> reset(@RequestBody ResetDto resetDto) {
        usersService.lambdaUpdate()
                .eq(Users::getUserId, resetDto.getUserId())
                .set(Users::getPassword, DEFAULT_PASSWORD)
                .update();
        return R.ok(OPERATION_OK);
    }


    /**
     * 更改密码
     *
     * @param dto DTO
     * @return {@link R}<{@link Boolean}>
     */
    @PostMapping("/changePassword")
    public R<Boolean> changePwd(@RequestBody @Valid ChangePwdDto dto) {
        return usersService.changePwd(dto);
    }

    /**
     * 获取用户数
     *
     * @return {@link R}<{@link Long}>
     */
    @GetMapping("/getUserCount")
    public R<Long> getUserCount() {
        return R.ok(usersService.count());
    }
}

